Dynamicke pole se vzdalenym pristupem

Otázka od: David Kraina

18. 9. 2004 20:25

Dobry den,
 marne uz vice jak pul dne bojuju s pointery a tak se pokusim obratit pro
pomoc mezi (mozna) odborniky :

Mam dve procedury :

Procedure A;
Var PA : Array of Char;
      X : Pointer;
Begin
  B(X);
  SetLength(X, ?);
  CopyMemory(PA, X, ...
  FreeMem(X);
End;

Procedure B(out Buffer : Ponter);
Begin
  GetMem(Buffer, ?);
  CopyMemory(Buffer ...
...a vrati velikost, se kterou pak pracuju...
End;

Jestli jste nekdo pochopili umysl, potrebuji, aby procedura B realokovala
predany buffer, a nahazela tam co potrebuje.
Zkousel jsem uz vsechno mozne, ale zvdy to konci "Invalid pointer operation"
ci RE 216 - "Access volation".
Nekdy to zase funguje, ale uz nelze s bufferem, ktery preda B nijak
manipulovat (2. instance)
Taky nechapu, pro GetMem nealokuje to, co po nem chcu, ale mnohem vice, coz
je problem a musim pole zkracovat - problem vyse.
Ideal proste je, ze funkci B predam PA a o nic vic se nestarat.

Asi to zni dosti zoufale, ale uz toho mam fakt plne vsechno, a tak diky za
kazdou radu.

 S pozdravem



David Kraina, DKx
---------------------------
Vedouci vyvojarskeho tymu MX-3, programator

http://DKx.MX-3.cz
http://www.MX-3.cz




Odpovedá: tondrej@t-online.de

18. 9. 2004 20:40

> Jestli jste nekdo pochopili umysl,

Sorry, nepochopil som.

> potrebuji, aby procedura B realokovala
> predany buffer, a nahazela tam co potrebuje.

Kedze ten parameter je deklarovany ako out, prva vec, co ta procedura
urobi, je nastavi ho na nil. Okrem toho, v tele pouzivas GetMem, takze
nechapem, co hovoris o realokacii.

Procedura A zase obsahuje pseudokod, ktory uz vobec nechapem a myslim,
ze SetLength s parametrom typu Pointer sa ani neskompiluje.

> Asi to zni dosti zoufale, ale uz toho mam fakt plne vsechno, a tak diky za
> kazdou radu.

Skus inymi slovami a podrobnejsie popisat, co sa snazis dosiahnut a aky
je s tym problem.

HTH
TOndrej


Odpovedá: Slavomir Skopalik

18. 9. 2004 20:55

> Dobry den,
> marne uz vice jak pul dne bojuju s pointery a tak se pokusim
> obratit pro pomoc mezi (mozna) odborniky :

 

>
> Mam dve procedury :
>
> Procedure A;
> Var PA : Array of Char;
> X : Pointer;
> Begin
> B(X);
> SetLength(X, ?);
> CopyMemory(PA, X, ...
> FreeMem(X);
> End;
>
> Procedure B(out Buffer : Ponter);
> Begin
> GetMem(Buffer, ?);
> CopyMemory(Buffer ...
> ...a vrati velikost, se kterou pak pracuju...
> End;
>

Tedy, vubec jsem nepochopil smysl tveho snazeni.
Zkus popsat o co ti jde, na mne to pusobi, jako ze chces prihodit neco
malo na zacatek (nebo konec ?)
buffru. Uz vubec nechapu vyznam PA (deklarujes dynamicke pole), proc ?
Podle men tohle nejde ani prelozit (nezkosel jsem).

 Slavek


Odpovedá: Vlastimil Burian

18. 9. 2004 21:37

Mel bys byt trochu konkretnejsi ! Z toho cos napsal moc nepoznam(e) jake mas
presne umysly. Nevim jestli sem ten umysl pochopil ale mrkni na tohle:

-----------------------
mas tlacitko, po kliknuti si alokujeme nakou pamet pro BufX jako zdrojovy
buffer pro pozdejsi kopirovani, dame si do nej neco abychom pak mohli
vyzkouset jestli to funguje ...
-----------------------


const
  SIZEofBUFFER = 200;

var
  BufX : Pointer;

procedure B(out Buffer: Pointer);
begin
  GetMem(Buffer, SIZEofBUFFER);
  CopyMemory(Buffer, BufX, SizeOf(BufX));
end;

procedure A;

var PA : Array of Char;
     X : Pointer;

begin
  B(X);

 // velikost dynam. pole zalezi na tom co tam davas ... v tomhle pripade to
bude stacit
  SetLength(PA, SIZEofBUFFER);

  CopyMemory(PA, X, Length(PA));
  FreeMem(X);

  showmessage(PA[0]); // test

end;

procedure TForm1.Button1Click(Sender: TObject);
begin

  GetMem(BufX, SIZEofBUFFER);

  Char(BufX^) := 'X';

  try
    A;
  finally
    FreeMem(BufX);
  end;

end;



Dobry den,
 marne uz vice jak pul dne bojuju s pointery a tak se pokusim obratit pro
pomoc mezi (mozna) odborniky :

Mam dve procedury :

Procedure A;
Var PA : Array of Char;
      X : Pointer;
Begin
  B(X);
  SetLength(X, ?);
  CopyMemory(PA, X, ...
  FreeMem(X);
End;

Procedure B(out Buffer : Ponter);
Begin
  GetMem(Buffer, ?);
  CopyMemory(Buffer ...
...a vrati velikost, se kterou pak pracuju...
End;

Jestli jste nekdo pochopili umysl, potrebuji, aby procedura B realokovala
predany buffer, a nahazela tam co potrebuje.
Zkousel jsem uz vsechno mozne, ale zvdy to konci "Invalid pointer operation"
ci RE 216 - "Access volation".
Nekdy to zase funguje, ale uz nelze s bufferem, ktery preda B nijak
manipulovat (2. instance)
Taky nechapu, pro GetMem nealokuje to, co po nem chcu, ale mnohem vice, coz
je problem a musim pole zkracovat - problem vyse.
Ideal proste je, ze funkci B predam PA a o nic vic se nestarat.

Asi to zni dosti zoufale, ale uz toho mam fakt plne vsechno, a tak diky za
kazdou radu.

 S pozdravem



David Kraina, DKx
---------------------------
Vedouci vyvojarskeho tymu MX-3, programator

http://DKx.MX-3.cz
http://www.MX-3.cz